iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 17
0
自我挑戰組

ROS自學筆記系列 第 17

Day 17 - 使用Python撰寫Client Node

  • 分享至 

  • xImage
  •  

這裡有沒有寶友啊~~~
今天台南sarfari zone開跑,讓小妹我好想趕快下去參加喔~~~
不過我這個六日就會去共襄盛舉啦~ 所以現在要來多存幾篇到時候發XD

昨天我們完成了Server版本的node,今天就是要來製作client node去打這個service囉!
一樣先創一個新的add_two_ints_client.py檔,並且設置成可執行:

$ roscd beginner_tutorials/src
$ vim add_two_ints_client.py
$ chmod +x add_two_ints_client.py

程式碼如下:

   1 #!/usr/bin/env python
   2 
   3 import sys
   4 import rospy
   5 from rospy_tutorials.srv import *
   6 
   7 def add_two_ints_client(x, y):
   8     rospy.wait_for_service('add_two_ints')
   9     try:
  10         add_two_ints = rospy.ServiceProxy('add_two_ints', AddTwoInts)
  11         resp1 = add_two_ints(x, y)
  12         return resp1.sum
  13     except rospy.ServiceException, e:
  14         print "Service call failed: %s"%e
  15 
  16 def usage():
  17     return "%s [x y]"%sys.argv[0]
  18 
  19 if __name__ == "__main__":
  20     if len(sys.argv) == 3:
  21         x = int(sys.argv[1])
  22         y = int(sys.argv[2])
  23     else:
  24         print usage()
  25         sys.exit(1)
  26     print "Requesting %s+%s"%(x, y)
  27     print "%s + %s = %s"%(x, y, add_two_ints_client(x, y))

其實有時候不知道到底放程式碼上來的時候要不要附行號,因為這樣就不能直接複製貼上了 XD
這邊比較需要注意的是client並不需要呼叫init_node(),直接call service就可以了:

   8     rospy.wait_for_service('add_two_ints')

這邊就是在監聽啦! 先等service架起來以後就可以去打了這樣。
wait_for_service的函式定義如下:

rospy.wait_for_service(service, timeout=None)

第一個參數就是service名稱,第二個參數可以設定等待的時間,如果超時就回傳一個exception表示發生異常。

  10         add_two_ints = rospy.ServiceProxy('add_two_ints', AddTwoInts)

這邊就是在打API打去給server啦!ServiceProxy的函式定義如下:

rospy.ServiceProxy(name, service_class, persistent=False, headers=None)

最多可以有四個參數,第一個參數就是service name,第二個參數是service的格式,第三個參數persistent表示是否要讓這個client一直跟server連接,這個設定可以允許client在呼叫service的時候連去別的node,但使用上需要很小心,需要自己定義連結失敗的時候要怎麼處理。
第四個參數header是在每次呼叫的時候都可以放在標頭的參數,可以用來製作cookies。(看完之後覺得跟打API更像了 XD)

完成後記得執行catkin_make,依照官網所說是為了確保service建置完成。
ros client node執行畫面
最後執行畫面就是長這樣啦! 接下來我會寫兩篇C++的版本,然後做個小結,就可以出發台南囉~~~~


上一篇
Day 16 - 使用Python撰寫Server Node
下一篇
Day 18 - 使用C++撰寫Server Node
系列文
ROS自學筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言